﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using static Modules.MQTT.Constants;

namespace Modules.MQTT
{
    public class SendCommandHQTopic
    {
        public static string GetTopIc(string code)
        {
            return $"mqtt/face/{code}";
        }
    }

    public class SendCommandHQ<T>
    {
        /// <summary>
        /// 命令
        /// </summary>
        public string @operator { get; set; }
        /// <summary>
        /// 消息Id
        /// </summary>
        public string messageId { get; set; }

        #region 批量增加或修改人员
        /// <summary>
        /// 数据包开始标识，检测数据包完整性
        /// </summary>
        public string? DataBegin { get; set; }

        /// <summary>
        /// 数据包结束标识，检测数据包完整性
        /// </summary>
        public string? DataEnd { get; set; }

        /// <summary>
        /// 人员数目,必须和对应人员信息 json 个 数一致
        /// </summary>
        public int? PersonNum { get; set; }
        #endregion
        /// <summary>
        /// 内容
        /// </summary>
        public T info { get; set; }

    }
    /// <summary>
    /// 设置系统时间
    /// </summary>
    public class SetSysTime
    {
        public string SysTime { get; set; }
    }


    /// <summary>
    /// 批量增加人员信息
    /// </summary>
    public class AddOrEditPersons
    {
        /// <summary>
        ///  平台生成的 id,唯一标识不同人员，建议使用身份证号，传入 customId设备已经存在视为修改，否则为增加
        /// </summary>
        public string customId { get; set; }

        /// <summary>
        ///  人员名字
        /// </summary>
        public string name { get; set; }

        /// <summary>
        ///  0: 白名单 1: 黑名单
        /// </summary>
        public PersonType personType { get; set; }

        /// <summary>
        ///  名单类型
        /// </summary>
        public TempCardType TempCardType { get; set; }

        /// <summary>
        ///  临时名单开始时间名单类型为临时名单 1 或 2 或 4 时必填
        /// </summary>
        public DateTime? CardValidBegin { get; set; }

        /// <summary>
        ///  临时名单结束时间名单类型为临时名单 1 或 2 或 4 时必填
        /// </summary>
        public DateTime? CardValidEnd { get; set; }

        /// <summary>
        ///  临时名单 3 或临时名单 4 的有效次数,名单类型为临时名单 3 或临时名单4 时必填
        /// </summary>
        public int? EffectNumber { get; set; }

        /// <summary>
        ///  民族
        /// </summary>
        public Nation? Nation { get; set; }

        /// <summary>
        ///  性别
        /// </summary>
        public Gender? Gender { get; set; }

        /// <summary>
        ///  证件号码
        /// </summary>
        public string? idCard { get; set; }

        /// <summary>
        ///  生日
        /// </summary>
        public DateTime? birthday { get; set; }

        /// <summary>
        ///  电话号码
        /// </summary>
        public string? telnum1 { get; set; }

        /// <summary>
        ///  籍贯
        /// </summary>
        public string? native { get; set; }

        /// <summary>
        ///  住址
        /// </summary>
        public string? address { get; set; }

        /// <summary>
        ///  备注
        /// </summary>
        public string? notes { get; set; }

        /// <summary>
        ///  韦根卡号生成方式(0: 公用卡号 1: 自动生成 2: 手动输入 3: 不使用门禁)
        /// </summary>
        public CardType2? CardType2 { get; set; }

        /// <summary>
        ///  组成韦根卡号根据的韦根协议;当 cardType2=2 必填； 0: 26 位 1: 34 位 6:26 位(8+16 facility code+userid(设备代码+卡号)分开填 写); 7:34 位(8+24 facility code+userid(设备代码+卡号)分开填 写) 默认:1(34 位)
        /// </summary>
        public WiegandType? WiegandType { get; set; }

        /// <summary>
        ///  设备代码(Facility code);当 WiegandType= 6 or 7 时必填; 和 cardNum2 一起使用。当 WiegandType=0 or 1 时,不必填
        /// </summary>
        public int? WGFacilityCode { get; set; }

        /// <summary>
        ///  韦根门禁卡号(userid) cardType2 为 2 时必填
        /// </summary>
        public int? CardNum2 { get; set; }

        /// <summary>
        ///  组成门禁卡号采用模式 0: 十进制构成卡号 1: 十六进制构成卡号 默认 0: 十进制构成卡号
        /// </summary>
        public CardMode? CardMode { get; set; }

        /// <summary>
        ///  组成 RF（ID）卡号采用模式， 针对内置刷卡机型 0: 十进制构成卡号 1: 十六进制构成卡号 默认 1: 十六进制构成卡号
        /// </summary>
        public RFCardMode? RFCardMode { get; set; }

        /// <summary>
        ///  ID 卡卡号，最大长度为 10 个字符 长度,针对内置刷卡机型（含结束 符），如果只是重新编辑名单，不 改变卡号，则不需要传入 RFIDCard 关键字
        /// 如果 RFCardMode=0， 填 入 十 进 制 字 符 串 (“1369406761”)；如 果 RFCardMode=1，填 入 十 六 进 制 字 符 串 (“519F7D29”)
        /// </summary>
        public int? RFIDCard { get; set; }

        /// <summary>
        ///  证件类型：0 身份证
        /// </summary>
        public CardType? CardType { get; set; }

        /// <summary>
        ///  人员图片（base64 编码，不超过 1M），和 PicURI 2 选 1
        /// </summary>
        public string Pic { get; set; }

        /// <summary>
        ///  人员图片（URI 地址），和 Pic 2 选 1
        /// </summary>
        public string picURI { get; set; }

        /// <summary>
        ///  检测添加的图片和底库的人员相似度， 大于设置的黑白名单验证门限值将添 加失败，用于排除相同人员图片被添加 多次。 0:不检测图片相似度(默认:0) 1：检测图片相似度
        /// </summary>
        public IsCheckSimilarity? isCheckSimilarity { get; set; }
    }


    public class Constants {

        #region 认证识别结果推送

        public enum VerifyStatus
        {
            无 = 0,
            允许 = 1,
            拒绝 = 2,
            还没有注册 = 3,

            [Display(Name = "待核验(开门方式为 3:人脸核验远程开门方式的控制记录)")]
            待核验 = 22,

            [Display(Name = "无权限（特殊版本非通行时间段的控制记录）")]
            无权限 = 24
        }

        public enum PersonType
        {
            白名单 = 0,
            黑名单 = 1
        }

        public enum Sendintime
        {
            [Display(Name = "非实时数据（非 10S 内产生对的记录）")]
            非实时数据 = 0,
            [Display(Name = "实时数据（10S 内产生对的记录）")] 实时数据 = 1
        }

        public enum Otype
        {
            白名单验证 = 1,
            [Display(Name = "实时数据（10S 内产生对的记录）")] 身份证验证 = 2,
            [Display(Name = "白名单 + 身份证验证")] 白名单_身份证验证 = 3,
            [Display(Name = "MQTT 远程开门")] MQTT_远程开门 = 7,
            [Display(Name = "RF 卡验证(内置刷卡机型)")] RF_卡验证 = 21,

            [Display(Name = "RF 卡验证 + 白名单验证(内置刷卡机型)")]
            RF_卡验证_白名单验证 = 22,
            韦根卡验证 = 24,
            [Display(Name = "韦根卡 + 白名单验证")] 韦根卡_白名单验证 = 25,
            [Display(Name = "HTTP 远程开门")] HTTP_远程开门 = 27,
        }

        public enum isNoMask
        {
            戴口罩通行 = 0,
            未戴口罩通行 = 1
        }

        #endregion

        #region 增加和修改人员名单

        public enum TempCardType
        {
            永久名单 = 0,
            [Display(Name = "临时名单 1(时间段有效)")] 临时名单1 = 1,
            [Display(Name = "临时名单 2(每天同一时间段有效)")] 临时名单2 = 2,
            [Display(Name = "临时名单 3(次数有效)")] 临时名单3 = 3,

            [Display(Name = "临时名单 4（每天同一时间段有效或者次数有效）")]
            临时名单4 = 4
        }

        public enum Nation
        {
            汉 = 1,
            蒙古 = 2,
            回 = 3,
            藏 = 4,
            维吾尔 = 5,
            苗 = 6,
            彝 = 7,
            壮 = 8,
            布依 = 9,
            朝鲜 = 10,
            满 = 11,
            侗 = 12,
            瑶 = 13,
            白 = 14,
            土家 = 15,
            哈尼 = 16,
            哈萨克 = 17,
            傣 = 18,
            黎 = 19,
            傈僳 = 20,
            佤 = 21,
            畲 = 22,
            高山 = 23,
            拉祜 = 24,
            水 = 25,
            东乡 = 26,
            纳西 = 27,
            景颇 = 28,
            柯尔克孜 = 29,
            土 = 30,
            达斡尔 = 31,
            仫佬 = 32,
            羌 = 33,
            布朗 = 34,
            撒拉 = 35,
            毛南 = 36,
            仡佬 = 37,
            锡伯 = 38,
            阿昌 = 39,
            普米 = 40,
            塔吉克 = 41,
            怒 = 42,
            乌孜别克 = 43,
            俄罗斯 = 44,
            鄂温克 = 45,
            德昂 = 46,
            保安 = 47,
            裕固 = 48,
            京 = 49,
            塔塔尔 = 50,
            独龙 = 51,
            鄂伦春 = 52,
            赫哲 = 53,
            门巴 = 54,
            珞巴 = 55,
            基诺 = 56,
            其他 = 57,
        }

        public enum Gender
        {
            男 = 0,
            女 = 1
        }

        public enum CardType2
        {
            公用卡号 = 0,
            自动生成 = 1,
            手动输入 = 2,
            不使用门禁 = 3,
        }

        public enum WiegandType
        {
            [Display(Name = "26位")] TwentySix位 = 0,
            [Display(Name = "34位")] ThirtyFour位 = 1,

            [Display(Name = "26位(8+16 facilitycode+userid(设备代码+卡号)分开填写)")]
            TwentySix位_1 = 6,

            [Display(Name = "34位(8+16 facilitycode+userid(设备代码+卡号)分开填写)")]
            ThirtyFour位_1 = 7
        }

        public enum CardMode
        {
            十进制构成卡号 = 0,
            十六进制构成卡号 = 1,
        }

        public enum RFCardMode
        {
            十进制构成卡号 = 0,
            十六进制构成卡号 = 1,
        }

        public enum CardType
        {
            身份证 = 0,
        }

        public enum Picture
        {
            名单不带图片信息 = 0,
            名单带图片信息 = 1,
        }

        public enum PersonType2
        {
            白名单 = 0,
            黑名单 = 1,
            所有 = 2,
        }

        public enum Gender2
        {
            男 = 0,
            女 = 1,
            所有 = 2,
        }

        #endregion

        #region 下发删除所有人员名单

        public enum Deleteall
        {
            确认删除 = 1,
            直接删除 = 0,
        }

        #endregion

        #region 批量增加人员

        public enum IsCheckSimilarity
        {
            不检测图片相似度 = 0,
            检测图片相似度 = 1,
        }

        public enum QueryProgressStatus
        {
            空闲状态 = 0,
            AddPersons_忙状态 = 1,
            EditPersons_忙状态 = 2,
            EditPersonsNew_忙状态 = 3,
        }

        #endregion

        #region 远程升级版本和获取版本信息

        public enum UpgradeType
        {
            //中间的值（2、3、4）预留
            [Display(Name = "软件固件升级（x.swx）")] 软件固件升级 = 1,
            [Display(Name = "授权文件（x.lic）")] 授权文件 = 5,
        }

        public enum OpenDoor
        {
            不开门 = 0,
            开门 = 1,
        }

        public enum PushAckType
        {
            回复接收到陌生人抓拍信息 = 1,
            回复接收到认证记录信息 = 2,
        }

        #endregion

        #region 播放语音文件

        public enum UsrType
        {
            播放一体机原有声音文件 = 1,
            播放一体机客户自定义声音文件 = 2,
        }

        #endregion

        #region 二维码

        public enum ImageType
        {
            待显示二维码图像 = 1,
            待显示图像格式为_png = 2,
            待显示图像格式为_jpg = 3,
            待显示图像格式为_bmp = 4,
        }

        #endregion

        #region 获取抓拍场景图

        public enum ImgType
        {
            yuv = 0,
            bmp = 1,
            jpeg = 2,
        }

        #endregion

        #region 检测图片人脸

        public enum DetectFace
        {
            未检测到人脸 = 0,
            检测到人脸 = 1,
        }

        #endregion
    }
}
